﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using OpenMUD.Mudlib.lib.Loc;
using Open_MUD.Mudlib.lib.Loc.Capas;

namespace Open_MUD.Mudlib.lib.Loc.Mapas
{
    class SalidaContinente
    {
       private int xContinente;
       private int yContinente;
       private string nombresalida;
       private Map destino;
       private int xdestino;
       private int ydestino;
       
       public SalidaContinente(int x, int y , string nom, Map dest, int xdest, int ydest)
       {
          xContinente = x;
          yContinente = y;
          nombresalida = nom;
          destino = dest;
          xdestino = xdest;
          ydestino = ydest;
       }       
       
       public static string generateKey(int x, int y)
       {
          return Convert.ToString(x) + "-" + Convert.ToString(y);
       }
       
    } 
    
    class Continente:Map
    {
        public enum Ciudadania {Salvajes,CastilloNegro,Skagos,UltimoHogar,IslaOso,BastionKar,Bosquespeso,FuerteTerror,Invernalia,CiudadelaTorrhen,Atalayadelaviuda,PuertoBlanco,FosoCailin,Aguasgrises,TresHermanas,Guijarro,LosGemelos,Varamar,Pyke,NidoAguilas,Salinas,Aguasdulces,ElRisco,Maraceniza,ColmilloDorado,Torrelabella,Lannisport,RocaCasterly,RefugioPlata,Altocorazon,TorreonBellota,PrincesaRosada,SeptodePiedra,Harrenhall,PozoDoncella,ValleOscuro,Rosby,Desembarco,Rocadragon,Sotodeoro,Puenteamargo,Valdehierba,GranMensa,LaSidra,VadoCeniza,AltoJardin,Aguasclaras,Colmenar,Antigua, CornaNegra, TresTorres, ElRejo, ColinaCuerno, CantoNocturno, RefugioNegro, RefugioEstival, Niebla, CastilloPiedraverde, CastilloAtardecer, PuertaBronce, Wyl, SepulcroRey, MonteNegro, Campoestrella, Asperon, Sotoinfierno, Palosanto, Tor, ColinaFantasma, Bondadivina, CostaSalada, Limonar, LanzaDelSol };
        
        
        private CapaGEO capaGeo;
        private CapaGIS capaPolitica;
        private CapaGIS capaClimatica;
        private CapaGIS capaClimatologica;
        private Dictionary<string,SalidaContinente> salidas = new Dictionary<string,SalidaContinente>();
        
        public override OpenMUD.Mudlib.lib.Loc.Room InstanceRoom(int x, int y)
        {
            Room ret = new Room();
            //TODO: cargar datos de las capas GIS
            //public void setData(int x, int y, Bioma bi, Ciudadania ciu, Clima c, Viento v, Humedad h, Tipo t, int temp)
            ret.setData(x, y, capaGeo.DameBioma(x, y), Ciudadania.Invernalia, Room.Clima.Humedo, Room.Viento.Quieto, Room.Humedad.Moderado, Room.Tipo.Exterior, 22);
             if  ( y > 0 )
                ret.AddSalida(new Salida(this.Nombre, "norte", x, y - 1));
            if ( x > 0 )
            {
               if ( y > 0)
                   ret.AddSalida(new Salida(this.Nombre, "noroeste", x - 1, y - 1));
                   
               ret.AddSalida(new Salida(this.Nombre, "oeste",x-1,y));
               
               if (y < alto - 1)
                   ret.AddSalida(new Salida(this.Nombre, "suroeste", x - 1, y + 1));
            }
            if ( y < alto -1 )
                ret.AddSalida(new Salida(this.Nombre, "sur", x, y + 1));
                
            if (x < ancho -1)
            {
               if (y < alto - 1 )
                   ret.AddSalida(new Salida(this.Nombre, "sureste", x + 1, y + 1));
                   
               ret.AddSalida(new Salida(this.Nombre, "este", x + 1, y));
               
               if (y > 0)
                   ret.AddSalida(new Salida(this.Nombre, "noreste", x + 1, y - 1));
               
            }
           
            if ( salidas.ContainsKey( SalidaContinente.generateKey(x,y) ) )
            {
               //todo: añadir salida
            }
               

            Rooms[x][y] = ret;
            return ret;
        }
        
        public override void CreateMap(string name, string mapabase, int maxx, int maxy)
        {
            base.CreateMap(name, mapabase,maxx, maxy);
            string filename =""; // TODO: get from xmlconfig
            capaGeo = new CapaGEO();
            // los parametros de createcapa se recogen de xmlconfigs
            capaGeo.CreateCapa(mapabase + "geografica.png");
        }
        
        public void AddSalida(int x, int y, string nom, Map dest, int xdest, int ydest)
        {
           SalidaContinente sc = new SalidaContinente(x,y,nom,dest,xdest,ydest);
           salidas.Add(SalidaContinente.generateKey(x,y), sc);
        }
        
        
    }
    
}
